/**
 * HTTP请求封装
 * 基于 uni.request 封装的请求工具
 */

// 基础配置
const BASE_URL = 'https://test-app.lustory.net/'
// const BASE_URL = 'https://app.lustory.net/'
const TIMEOUT = 10000

/**
 * 请求拦截器
 * @param {Object} config 请求配置
 */
function requestInterceptor(config) {
	// 添加基础URL
	if (!config.url.startsWith('http')) {
		config.url = BASE_URL + config.url
	}
	
	// 添加默认headers
	config.header = {
		'Content-Type': 'application/json',
		...config.header
	}
	
	// 显示加载状态
	if (config.loading !== false) {
		uni.showLoading({
			title: 'loding...',
			mask: true
		})
	}
	
	return config
}

/**
 * 响应拦截器
 * @param {Object} response 响应数据
 */
function responseInterceptor(response) {
	// 隐藏加载状态
	uni.hideLoading()
	
	const { data, statusCode } = response
	
	// HTTP状态码检查
	if (statusCode !== 200) {
		uni.showToast({
			title: `请求失败: ${statusCode}`,
			icon: 'none'
		})
		return Promise.reject(new Error(`HTTP ${statusCode}`))
	}
	
	// 业务状态码检查
	if (data.code && data.code !== 200 && data.code !== 0) {
		uni.showToast({
			title: data.message || '请求失败',
			icon: 'none'
		})
		return Promise.reject(new Error(data.message || '请求失败'))
	}
	
	return data
}

/**
 * 错误处理
 * @param {Error} error 错误对象
 */
function errorHandler(error) {
	uni.hideLoading()
	
	console.error('请求错误:', error)
	
	uni.showToast({
		title: '网络请求失败',
		icon: 'none'
	})
	
	return Promise.reject(error)
}

/**
 * 基础请求方法
 * @param {Object} options 请求选项
 */
function request(options) {
	return new Promise((resolve, reject) => {
		// 请求拦截
		const config = requestInterceptor({
			timeout: TIMEOUT,
			...options
		})
		
		uni.request({
			...config,
			success: (response) => {
				try {
					const result = responseInterceptor(response)
					resolve(result)
				} catch (error) {
					reject(error)
				}
			},
			fail: (error) => {
				const handledError = errorHandler(error)
				reject(handledError)
			}
		})
	})
}

/**
 * GET请求
 * @param {String} url 请求地址
 * @param {Object} params 请求参数
 * @param {Object} options 额外选项
 */
export function get(url, params = {}, options = {}) {
	return request({
		url,
		method: 'GET',
		data: params,
		...options
	})
}

/**
 * POST请求
 * @param {String} url 请求地址
 * @param {Object} data 请求数据
 * @param {Object} options 额外选项
 */
export function post(url, data = {}, options = {}) {
	return request({
		url,
		method: 'POST',
		data,
		...options
	})
}

/**
 * PUT请求
 * @param {String} url 请求地址
 * @param {Object} data 请求数据
 * @param {Object} options 额外选项
 */
export function put(url, data = {}, options = {}) {
	return request({
		url,
		method: 'PUT',
		data,
		...options
	})
}

/**
 * DELETE请求
 * @param {String} url 请求地址
 * @param {Object} params 请求参数
 * @param {Object} options 额外选项
 */
export function del(url, params = {}, options = {}) {
	return request({
		url,
		method: 'DELETE',
		data: params,
		...options
	})
}

/**
 * 文件上传
 * @param {String} url 上传地址
 * @param {String} filePath 文件路径
 * @param {Object} formData 额外表单数据
 * @param {Object} options 额外选项
 */
export function upload(url, filePath, formData = {}, options = {}) {
	return new Promise((resolve, reject) => {
		// 添加基础URL
		if (!url.startsWith('http')) {
			url = BASE_URL + url
		}
		
		// 显示上传进度
		if (options.loading !== false) {
			uni.showLoading({
				title: '上传中...',
				mask: true
			})
		}
		
		uni.uploadFile({
			url,
			filePath,
			name: 'file',
			formData,
			header: {
				...options.header
			},
			success: (response) => {
				uni.hideLoading()
				
				try {
					const data = JSON.parse(response.data)
					if (data.code && data.code !== 200 && data.code !== 0) {
						uni.showToast({
							title: data.message || '上传失败',
							icon: 'none'
						})
						reject(new Error(data.message || '上传失败'))
					} else {
						resolve(data)
					}
				} catch (error) {
					reject(error)
				}
			},
			fail: (error) => {
				uni.hideLoading()
				uni.showToast({
					title: '上传失败',
					icon: 'none'
				})
				reject(error)
			}
		})
	})
}

// 导出默认请求实例
export default {
	get,
	post,
	put,
	del,
	upload,
	request
}
